import axios from "axios";
import { ElMessage } from 'element-plus'
import actions from '@/utils/qiankunAction'
import { WebTraceIdCache } from '@/utils/cache-util'

/* 防止重复提交，利用axios的cancelToken */
let pending = []; // 声明一个数组用于存储每个ajax请求的取消函数和ajax标识
const CancelToken = axios.CancelToken;

const removePending = (config, f) => {
   // 获取请求的url
   const flagUrl = config.url;
   const flagData = JSON.stringify(config.data)
   // url 不一样
   const urlDiffIndex = pending.findIndex(item => item.flagUrl == flagUrl)
   // url一样 data不一样
   const urlSameIndex = pending.findIndex(item => item.flagUrl == flagUrl && item.flagData != flagData)
   // url一样 data一样
   const allSameIndex = pending.findIndex(item => item.flagUrl == flagUrl && item.flagData == flagData)

   // url不一样 && 没请求完
   if(urlDiffIndex == -1 && f) {
     pending.push({flagUrl: flagUrl, flagData: flagData});
   }
   // url一样，data一样，没请求完
   if(allSameIndex !== -1 && f) {
     f("取消重复请求"); // 执行取消操作
   }
   // url一样，data不一样，没请求完
   if(urlSameIndex !== -1 && f) {
     pending.push({flagUrl: flagUrl, flagData: flagData});
   }
   // url一样，data一样，请求完
   if(allSameIndex !== -1 && !f) {
     pending.splice(allSameIndex, 1); // 把这条记录从数组中移除
   }
   // url一样，data不一样，请求完
   if(urlSameIndex !== -1 && !f) {
     pending.splice(urlSameIndex, 1); // 把这条记录从数组中移除
   }
   
  // 获取请求的url
  // const flagUrl = config.url;
  // // 判断该请求是否在请求队列中
  // if (pending.indexOf(flagUrl) !== -1) {
  //   // 如果在请求中，并存在f,f即axios提供的取消函数
  //   if (f) {
  //     f("取消重复请求"); // 执行取消操作
  //     console.log(flagUrl); // 执行取消操作
  //   } else {
  //     pending.splice(pending.indexOf(flagUrl), 1); // 把这条记录从数组中移除
  //   }
  // } else {
  //   // 如果不存在在请求队列中，加入队列
  //   if (f) {
  //     pending.push(flagUrl);
  //   }
  // }
};
/* 创建axios实例 */
const service = axios.create({
  // baseURL: import.meta.env.VITE_APP_BASE_API, //** 基础地址 要请求的url前缀
  // baseURL: ' http://zhaoshang-pc-test.crehopson.com/invest-portal', //** 基础地址 要请求的url前缀
  baseURL: process.env.VUE_APP_BASE_API, //** 基础地址 要请求的url前缀
  timeout: 120000, // 请求超时时间
  withCredentials: true // 允许携带cookie
});

/* request拦截器 */
service.interceptors.request.use(
  (config) => {
    // neverCancel 配置项，允许多个请求
    if (!config.neverCancel) {
      // 生成cancelToken
      config.cancelToken = new CancelToken((c) => {
        removePending(config, c);
      });
    }
    // console.log('@@@333')
    // console.log(config)
    // if(config.method == 'get') {
    //   const params = JSON.parse(config.data)
    //   let arr = []
    //   for(const key in params) {
    //     arr.push(`${key}=${params[key]}`)
    //   }
    //   config.url += '?' + arr.join('&')
    // }
    // 在这里可以统一修改请求头，例如 加入 用户 token 等操作
    //   if (store.getters.sessionId) {
    //     config.headers['X-SessionId'] = getSessionId(); // 让每个请求携带token--['X-Token']为自定义key
    //   }
    // config.headers['origin-url'] = window.location.href
    // config.headers['X-Gaia-Api-Key'] = import.meta.env.VITE_APP_API_KEY
    if(localStorage.getItem('authToken')) {
        const token = JSON.parse(localStorage.getItem('authToken')).access_token
        config.headers['Authorization'] = 'Bearer '+ token
    }
    config.headers['X-NXCloud-Owner'] = 'DEFAULT'
    config.headers['web-trace-id'] = WebTraceIdCache.get() ? WebTraceIdCache.get() : '' // 日志需要
    return config;
  },
  (error) => {
    Promise.reject(error);
  }
);

/* respone拦截器 */
service.interceptors.response.use(
  (response) => {   
    // 移除队列中的该请求，注意这时候没有传第二个参数f
    removePending(response.config);

    // 获取返回数据，并处理。按自己业务需求修改。
    // if (response.data.code == 200) {
    if (response.data.code == 10001) {
      // 告诉主项目：token失效
      actions.setGlobalState({isTokenInvalid: true});
      return Promise.reject("error");
      // return response;
    }

    if (Number(response.data.code) >= 10000) {
      // 请求失败，显示失败原因
      ElMessage.error(response.data.message)
      return response;
    }

    if (response.status !== 200) {
      return Promise.reject("error");
    } else {
      return response;
    }
  },
  (error) => {
    // 异常处理
    console.log(error);
    pending = [];
    if (error.message === "取消重复请求") {
      return Promise.reject(error);
    }
    return Promise.reject(error);
  }
);

export default service;
